package main

import (
	"fmt"
)

func main() {
	/*
		1.单向：定向
			chan <- T，只支持写（发送），不支持读（接收）
			<- chan T，只读（接收），不支持（发送）
			（单向通道往往是被用来做参数的）
        （1）单向通道：
                   在某些场景下，我们可能会将通道作为参数在多个任务函数间进行传递，
                通常我们会选择在不同的任务函数中对通道的使用进行限制，比如限制某个函数只能执行发送操作或只能执行接收操作。
        
        （2）好处：
                1.保证了数据的安全   
                2.让代码语义更清晰、更易读

        2.在函数传参及任何赋值操作中全向通道（正常通道）可以转换为单向通道，但是无法反向转换
            正常通道 —✔—> 单向通道 ✔
            单向通道 —✘—> 正常通道 ✘
	*/
	ch1 := make(chan int) //双向，读，写
	//ch2 := make(chan<- int) //单向，只能写，不能读
	//ch3 := make(<-chan int) //单向，只能读，不能写

	//ch1 <- 100
	//data1 := <-ch1
	//fmt.Println(data1)
	//ch2 <- 1000
	//data2 := <-ch2 //cannot receive from senly channel ch2 (variable of type chan<- int)
	//data3 := <-ch3
	//fmt.Println(data3)
	//ch3 <- 2000 //cannot send to receive-ochannel ch3 (variable of type <-chan int)

	go fun01(ch1) //可读，可写
	//go fun01(ch2) //只写

	data := <-ch1
	fmt.Println("fun01函数中写出的数据是：", data)

	go fun02(ch1)
	//fun02(ch3)

	ch1 <- 200
	fmt.Println("main...over...")

}

// 该函数，只能操作只写的通道
func fun01(ch chan<- int) {
	//在函数内部，对于 ch1 通道，只能写数据，不能读取数据
	ch <- 100
	fmt.Println("fun01函数结束。。。")
}

// 该函数，只能操作只读的通道
func fun02(ch <-chan int) {
	data := <-ch
	fmt.Println("fun02函数，从ch中读取的数据是：", data)
}
